home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / X-Ray / X-Ray INIT Source / qdPatches.c < prev    next >
Encoding:
Text File  |  1999-06-08  |  87.8 KB  |  1,862 lines  |  [TEXT/CWIE]

  1. // Copyright (C) 1999 Eric Roccasecca.  All rights reserved.
  2.  
  3. #include "X_Ray_Priv.h"
  4.  
  5. UniversalProcPtr    gOldStdLine, gStdLineUPP = nil,
  6.                     gOldStdRect, gStdRectUPP = nil,
  7.                     gOldStdOval, gStdOvalUPP = nil,
  8.                     gOldStdRgn, gStdRgnUPP = nil,
  9.                     gOldStdRRect, gStdRRectUPP = nil,
  10.                     gOldStdPoly, gStdPolyUPP = nil,
  11.                     gOldStdArc, gStdArcUPP = nil,
  12.                     gOldStdText, gStdTextUPP = nil,
  13.                     gOldStdBits, gStdBitsUPP = nil,
  14.                     gOldCopyBits, gCopyBitsUPP = nil,
  15.                     gOldCopyMask, gCopyMaskUPP = nil,
  16.                     gOldCopyDeepMask, gCopyDeepMaskUPP = nil,
  17.                     gOldScrollRect, gScrollRectUPP = nil;
  18.  
  19.  
  20. // used to share port info during any drawing X-Ray intercepts
  21. RgnHandle                        qd_curClipRgn, qd_copyBitsToSelfClipRgn;
  22. GrafPtr                            qd_origPort;
  23. CGrafPtr                        qd_origGWorld;
  24. GDHandle                        qd_origGDH;
  25.  
  26. CQDProcs                        qd_curCQDProcs,
  27.                                 *qd_underBufferCQDProcs = nil;
  28.  
  29. ThemeDrawingState                qd_curDrawState;
  30.  
  31. RGBColor                        qd_foreColor, qd_backColor;
  32.  
  33. FontInfo                        qd_fInfo;
  34.  
  35. X_Ray_AppRecHandle                qd_curApp;
  36.  
  37. UInt8                            qd_Hilite;
  38.  
  39. // globals used for determining X-Ray draws
  40. Point                            qd_startPoint, qd_endPoint;
  41. Rect                            qd_drawingRect, qd_curDrawingRect;
  42. RgnHandle                        qd_drawingRgn, qd_curDrawRgn;
  43. X_Ray_WindowHandle                qd_transWin, qd_intersection, qd_curIntersection,
  44.                                 qd_tempWin; // never rely on this accross calls
  45. Boolean                            qd_bitMapOnScreen;
  46. PixMapHandle                    qd_contPMap, qd_mixPMap, qd_underPMap, qd_curUnderPMap, qd_maskPMap;
  47.  
  48. short                            gUpdatePassDebug;
  49.  
  50. OSErr                            qd_err;
  51.  
  52. Boolean                            gDoingUpdateAboveDebug = false;
  53.  
  54. short                            X_RayDrawLevel = 0;
  55.  
  56. extern Boolean                    gProcessManagerIsRunning;
  57. extern RgnHandle                gIntersectCurPortVisRgn, gIntersectCurTransVisRgn;
  58.  
  59. pascal void X_Ray_StdLine (Point endPoint);
  60. pascal void X_Ray_StdArc (GrafVerb verb, const Rect *theRect, short startAngle, short arcAngle);
  61. pascal void X_Ray_StdRRect (GrafVerb verb, const Rect *theRect, short ovalWidth, short ovalHeight);
  62. pascal void X_Ray_StdText (short count, const void *textAddr, Point *numer, Point *denom);
  63. pascal void X_Ray_StdRect (GrafVerb verb, const Rect *theRect);
  64. pascal void X_Ray_StdPoly (GrafVerb verb, PolyHandle poly);
  65. pascal void X_Ray_StdOval (GrafVerb verb, const Rect *theRect);
  66. pascal void X_Ray_StdOval (GrafVerb verb, const Rect *theRect);
  67. pascal void X_Ray_StdRgn (GrafVerb verb, RgnHandle rgn);
  68. pascal void X_Ray_StdBits (const BitMap *srcBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn);
  69. pascal void X_Ray_CopyBits (const BitMap *srcBits, const BitMap *dstBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn);
  70. pascal void X_Ray_CopyMask (const BitMap *srcBits, const BitMap *maskBits, const BitMap *dstBits, const Rect *srcRect, const Rect *maskRect, const Rect *dstRect);
  71. pascal void X_Ray_CopyDeepMask (const BitMap *srcBits, const BitMap *maskBits, const BitMap *dstBits, const Rect *srcRect, const Rect *maskRect, const Rect *dstRect, short mode, RgnHandle maskRgn);
  72. pascal void X_Ray_ScrollRect (const Rect *theRect, short dh, short dv, RgnHandle updateRgn);
  73.  
  74. void SetupUnderBufferGWorld (GWorldPtr curUnderBuffer, GrafPtr sourcePort);
  75. void UnsetupUnderBufferGWorld (GWorldPtr curUnderBuffer, GrafPtr sourcePort);
  76. void UpdateTransparentWindows (Boolean normal);
  77.  
  78. #define UpdateTransparentWindows_Normal() UpdateTransparentWindows(true)
  79. #define UpdateTransparentWindows_Special() UpdateTransparentWindows(false)
  80.  
  81. Boolean InitInternalQuickDraw (void)
  82. {
  83.     // intialize global regions
  84.     qd_drawingRgn = NewRgn();
  85.     qd_curClipRgn  = NewRgn();
  86.     qd_curDrawRgn = NewRgn();
  87.     qd_copyBitsToSelfClipRgn = NewRgn();
  88.     gIntersectCurPortVisRgn = NewRgn();
  89.     gIntersectCurTransVisRgn = NewRgn();
  90.     
  91.     // QuickDraw PATCHES
  92.     
  93.     // Apply patch to StdLine
  94.     gOldStdLine = NGetTrapAddress (_StdLine, ToolTrap);
  95.     gStdLineUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdLine, kStdLineProcInfo, kPowerPCISA);
  96.     if (gStdLineUPP)
  97.     {
  98.         NSetTrapAddress (gStdLineUPP, _StdLine, ToolTrap);
  99.     }
  100.     else
  101.         return false;
  102.     
  103.     // Apply patch to StdText
  104.     gOldStdText = NGetTrapAddress (_StdText, ToolTrap);
  105.     gStdTextUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdText, kStdTextProcInfo, kPowerPCISA);
  106.     if (gStdTextUPP)
  107.     {
  108.         NSetTrapAddress (gStdTextUPP, _StdText, ToolTrap);
  109.     }
  110.     else
  111.         return false;
  112.     
  113.     // Apply patch to StdRect
  114.     gOldStdRect = NGetTrapAddress (_StdRect, ToolTrap);
  115.     gStdRectUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdRect, kStdRectProcInfo, kPowerPCISA);
  116.     if (gStdRectUPP)
  117.     {
  118.         NSetTrapAddress (gStdRectUPP, _StdRect, ToolTrap);
  119.     }
  120.     else
  121.         return false;
  122.     
  123.     // Apply patch to StdRRect
  124.     gOldStdRRect = NGetTrapAddress (_StdRRect, ToolTrap);
  125.     gStdRRectUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdRRect, kStdRRectProcInfo, kPowerPCISA);
  126.     if (gStdRRectUPP)
  127.     {
  128.         NSetTrapAddress (gStdRRectUPP, _StdRRect, ToolTrap);
  129.     }
  130.     else
  131.         return false;
  132.     
  133.     // Apply patch to StdArc
  134.     gOldStdArc = NGetTrapAddress (_StdArc, ToolTrap);
  135.     gStdArcUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdArc, kStdArcProcInfo, kPowerPCISA);
  136.     if (gStdArcUPP)
  137.     {
  138.         NSetTrapAddress (gStdArcUPP, _StdArc, ToolTrap);
  139.     }
  140.     else
  141.         return false;
  142.     
  143.     // Apply patch to StdPoly
  144.     gOldStdPoly = NGetTrapAddress (_StdPoly, ToolTrap);
  145.     gStdPolyUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdPoly, kStdPolyProcInfo, kPowerPCISA);
  146.     if (gStdPolyUPP)
  147.     {
  148.         NSetTrapAddress (gStdPolyUPP, _StdPoly, ToolTrap);
  149.     }
  150.     else
  151.         return false;
  152.     
  153.     // Apply patch to StdOval
  154.     gOldStdOval = NGetTrapAddress (_StdOval, ToolTrap);
  155.     gStdOvalUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdOval, kStdOvalProcInfo, kPowerPCISA);
  156.     if (gStdOvalUPP)
  157.     {
  158.         NSetTrapAddress (gStdOvalUPP, _StdOval, ToolTrap);
  159.     }
  160.     else
  161.         return false;
  162.     
  163.     // Apply patch to StdRgn
  164.     gOldStdRgn = NGetTrapAddress (_StdRgn, ToolTrap);
  165.     gStdRgnUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdRgn, kStdRgnProcInfo, kPowerPCISA);
  166.     if (gStdRgnUPP)
  167.     {
  168.         NSetTrapAddress (gStdRgnUPP, _StdRgn, ToolTrap);
  169.     }
  170.     else
  171.         return false;
  172.     
  173.     // Apply patch to StdBits
  174.     gOldStdBits = NGetTrapAddress (_StdBits, ToolTrap);
  175.     gStdBitsUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_StdBits, kStdBitsProcInfo, kPowerPCISA);
  176.     if (gStdBitsUPP)
  177.     {
  178.         NSetTrapAddress (gStdBitsUPP, _StdBits, ToolTrap);
  179.     }
  180.     else
  181.         return false;
  182.     
  183.     // Apply patch to CopyBits
  184.     gOldCopyBits = NGetTrapAddress (_CopyBits, ToolTrap);
  185.     gCopyBitsUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_CopyBits, kCopyBitsProcInfo, kPowerPCISA);
  186.     if (gCopyBitsUPP)
  187.     {
  188.         NSetTrapAddress (gCopyBitsUPP, _CopyBits, ToolTrap);
  189.     }
  190.     else
  191.         return false;
  192.     
  193.     // Apply patch to CopyDeepMask
  194.     gOldCopyDeepMask = NGetTrapAddress (_CopyDeepMask, ToolTrap);
  195.     gCopyDeepMaskUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_CopyDeepMask, kCopyDeepMaskProcInfo, kPowerPCISA);
  196.     if (gCopyDeepMaskUPP)
  197.     {
  198.         NSetTrapAddress (gCopyDeepMaskUPP, _CopyDeepMask, ToolTrap);
  199.     }
  200.     else
  201.         return false;
  202.     
  203.     // Apply patch to CopyMask
  204.     gOldCopyMask = NGetTrapAddress (_CopyMask, ToolTrap);
  205.     gCopyMaskUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_CopyMask, kCopyMaskProcInfo, kPowerPCISA);
  206.     if (gCopyMaskUPP)
  207.     {
  208.         NSetTrapAddress (gCopyMaskUPP, _CopyMask, ToolTrap);
  209.     }
  210.     else
  211.         return false;
  212.     
  213.     // Apply patch to ScrollRect
  214.     gOldScrollRect = NGetTrapAddress (_ScrollRect, ToolTrap);
  215.     gScrollRectUPP = NewRoutineDescriptor ((ProcPtr)X_Ray_ScrollRect, kScrollRectProcInfo, kPowerPCISA);
  216.     if (gScrollRectUPP)
  217.         NSetTrapAddress (gScrollRectUPP, _ScrollRect, ToolTrap);
  218.     else
  219.         return false;
  220.     
  221.     return true;
  222. }
  223.  
  224.  
  225. pascal void X_Ray_StdLine (Point endPoint)
  226. {
  227.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  228.     {
  229.         X_RayDrawLevel++;
  230.         
  231.         GetPort (&qd_origPort);
  232.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  233.         GetThemeDrawingState (&qd_curDrawState);
  234.         
  235.         qd_startPoint = qd_origPort->pnLoc;
  236.         qd_endPoint = endPoint;
  237.         Pt2Rect (qd_startPoint, qd_endPoint, &qd_drawingRect);
  238.         InsetRect (&qd_drawingRect, -1, -1);
  239.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  240.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  241.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  242.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                            // globalize draw region
  243.         LocalToGlobal (&qd_startPoint);
  244.         LocalToGlobal (&qd_endPoint);
  245.         
  246.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  247.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  248.         
  249.         if (qd_transWin || qd_intersection)
  250.         {
  251.             if (qd_transWin)    // current port is a transparent window
  252.             {
  253.                 //DebugStr ("\pStdLine in transparent");
  254.                 //CallUniversalProc (gOldStdLine, kStdLineProcInfo, endPoint);
  255.                 
  256.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  257.                 
  258.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  259.                 SetClip (qd_origPort->clipRgn);
  260.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  261.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  262.                 LockPixels (qd_contPMap);
  263.                 CallUniversalProc (gOldStdLine, kStdLineProcInfo, endPoint);
  264.                 UnlockPixels (qd_contPMap);
  265.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  266.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  267.                 
  268.                 SetGWorld (qd_origGWorld, qd_origGDH);
  269.             }
  270.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  271.             else if (qd_intersection)
  272.             {
  273.                 //DebugStr ("\pStdLine intersection");
  274.                 //CallUniversalProc (gOldStdLine, kStdLineProcInfo, endPoint);
  275.                 
  276.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  277.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  278.                 qd_curIntersection = qd_intersection;
  279.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  280.                 {
  281.                     SetPort ((*qd_curIntersection)->theWindow);
  282.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  283.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  284.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  285.                     if (!EmptyRgn (qd_curDrawRgn))
  286.                     {
  287.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  288.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  289.                         GlobalToLocal (&qd_startPoint);
  290.                         GlobalToLocal (&qd_endPoint);
  291.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  292.                         
  293.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  294.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  295.                         MoveTo (qd_startPoint.h, qd_startPoint.v);
  296.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  297.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  298.                         LockPixels (qd_underPMap);
  299.                         CallUniversalProc (gOldStdLine, kStdLineProcInfo, qd_endPoint);
  300.                         UnlockPixels (qd_underPMap);
  301.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  302.                         
  303.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  304.                         SetPort ((*qd_curIntersection)->theWindow);
  305.                         LocalToGlobal (&qd_startPoint);
  306.                         LocalToGlobal (&qd_endPoint);
  307.                     }                    
  308.                     
  309.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  310.                 }
  311.                 
  312.                 SetPort (qd_origPort);
  313.                 GetClip (qd_curClipRgn);
  314.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  315.                 SetClip (qd_drawingRgn);
  316.                 CallUniversalProc (gOldStdLine, kStdLineProcInfo, endPoint);
  317.                 SetClip (qd_curClipRgn);
  318.             }
  319.             
  320.             
  321.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  322.         }
  323.         else // no need to redirect this draw
  324.             CallUniversalProc (gOldStdLine, kStdLineProcInfo, endPoint);
  325.         
  326.         DisposeThemeDrawingState (qd_curDrawState);
  327.         X_RayDrawLevel--;
  328.     }
  329.     else
  330.         CallUniversalProc (gOldStdLine, kStdLineProcInfo, endPoint);
  331. }
  332.  
  333.  
  334. pascal void X_Ray_StdRect (GrafVerb verb, const Rect *theRect)
  335. {
  336.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  337.     {
  338.         X_RayDrawLevel++;
  339.         
  340.         GetPort (&qd_origPort);
  341.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  342.         qd_Hilite = LMGetHiliteMode();
  343.         GetThemeDrawingState (&qd_curDrawState);
  344.         
  345.         qd_drawingRect = *theRect;                                        // save current draw rect
  346.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  347.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  348.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  349.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                            // globalize draw region
  350.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  351.         
  352.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  353.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  354.         
  355.         if (qd_transWin || qd_intersection)
  356.         {
  357.             if (qd_transWin)    // current port is a transparent window
  358.             {
  359.                 //DebugStr ("\pStdRect in transparent");
  360.                 //CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect);
  361.                 
  362.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  363.                 
  364.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  365.                 SetClip (qd_drawingRgn);
  366.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  367.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  368.                 LockPixels (qd_contPMap);
  369.                 LMSetHiliteMode (qd_Hilite);
  370.                 
  371.                 CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect); // do the draw!
  372.                 
  373.                 UnlockPixels (qd_contPMap);
  374.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  375.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  376.                 
  377.                 SetGWorld (qd_origGWorld, qd_origGDH);
  378.             }
  379.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  380.             else if (qd_intersection)
  381.             {                
  382.                 //CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect);
  383.                 
  384.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  385.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  386.                 qd_curIntersection = qd_intersection;
  387.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  388.                 {
  389.                     SetPort ((*qd_curIntersection)->theWindow);
  390.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  391.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  392.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  393.                     if (!EmptyRgn (qd_curDrawRgn))
  394.                     {
  395.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  396.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  397.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  398.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  399.                         
  400.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  401.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  402.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  403.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  404.                         LockPixels (qd_underPMap);
  405.                         LMSetHiliteMode (qd_Hilite);
  406.                         
  407.                         CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, &qd_drawingRect); // do the draw!
  408.                         
  409.                         UnlockPixels (qd_underPMap);
  410.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  411.                         
  412.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  413.                         
  414.                         SetPort ((*qd_curIntersection)->theWindow);
  415.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  416.                     }
  417.                     
  418.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  419.                 }
  420.                 
  421.                 SetPort (qd_origPort);
  422.                 GetClip (qd_curClipRgn);
  423.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  424.                 SetClip (qd_drawingRgn);
  425.                 LMSetHiliteMode (qd_Hilite);
  426.                 CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect);
  427.                 SetClip (qd_curClipRgn);
  428.             }
  429.             
  430.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  431.         }
  432.         else // no need to redirect this draw
  433.             CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect);
  434.         
  435.         DisposeThemeDrawingState (qd_curDrawState);
  436.         X_RayDrawLevel--;
  437.     }
  438.     else
  439.         CallUniversalProc (gOldStdRect, kStdRectProcInfo, verb, theRect);
  440. }
  441.  
  442.  
  443. pascal void X_Ray_StdOval (GrafVerb verb, const Rect *theRect)
  444. {
  445.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  446.     {
  447.         X_RayDrawLevel++;
  448.         
  449.         GetPort (&qd_origPort);
  450.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  451.         qd_Hilite = LMGetHiliteMode();
  452.         GetThemeDrawingState (&qd_curDrawState);
  453.         
  454.         qd_drawingRect = *theRect;                                        // save current draw rect
  455.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  456.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  457.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  458.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  459.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  460.         
  461.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  462.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  463.         
  464.         if (qd_transWin || qd_intersection)
  465.         {
  466.             if (qd_transWin)    // current port is a transparent window
  467.             {
  468.                 //DebugStr ("\pStdOval in transparent");
  469.                 //CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect);
  470.                 
  471.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  472.                 
  473.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  474.                 SetClip (qd_drawingRgn);
  475.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  476.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  477.                 LockPixels (qd_contPMap);
  478.                 LMSetHiliteMode (qd_Hilite);
  479.  
  480.                 CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect); // do the draw!
  481.  
  482.                 UnlockPixels (qd_contPMap);
  483.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  484.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  485.                 
  486.                 SetGWorld (qd_origGWorld, qd_origGDH);
  487.             }
  488.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  489.             else if (qd_intersection)
  490.             {
  491.                 //DebugStr ("\pStdOval intersection");
  492.                 //CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect);
  493.                 
  494.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  495.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  496.                 qd_curIntersection = qd_intersection;
  497.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  498.                 {
  499.                     SetPort ((*qd_curIntersection)->theWindow);
  500.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  501.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  502.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  503.                     if (!EmptyRgn (qd_curDrawRgn))
  504.                     {
  505.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  506.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  507.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  508.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  509.                         
  510.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  511.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  512.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  513.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  514.                         LockPixels (qd_underPMap);
  515.                         LMSetHiliteMode (qd_Hilite);
  516.  
  517.                         CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, &qd_drawingRect); // do the draw!
  518.  
  519.                         UnlockPixels (qd_underPMap);
  520.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  521.                         
  522.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  523.                         SetPort ((*qd_curIntersection)->theWindow);
  524.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  525.                     }                    
  526.                     
  527.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  528.                 }
  529.                 
  530.                 SetPort (qd_origPort);
  531.                 GetClip (qd_curClipRgn);
  532.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  533.                 SetClip (qd_drawingRgn);
  534.                 LMSetHiliteMode (qd_Hilite);
  535.                 CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect);
  536.                 SetClip (qd_curClipRgn);
  537.             }
  538.             
  539.             UpdateTransparentWindows_Normal();    // updates transparent window under buffers from back to front
  540.         }
  541.         else // no need to redirect this draw
  542.             CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect);
  543.         
  544.         DisposeThemeDrawingState (qd_curDrawState);
  545.         X_RayDrawLevel--;
  546.     }
  547.     else
  548.         CallUniversalProc (gOldStdOval, kStdOvalProcInfo, verb, theRect);
  549. }
  550.  
  551.  
  552. pascal void X_Ray_StdRRect (GrafVerb verb, const Rect *theRect, short ovalWidth, short ovalHeight)
  553. {
  554.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  555.     {
  556.         X_RayDrawLevel++;
  557.         
  558.         GetPort (&qd_origPort);
  559.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  560.         qd_Hilite = LMGetHiliteMode();
  561.         GetThemeDrawingState (&qd_curDrawState);
  562.         
  563.         qd_drawingRect = *theRect;                                        // save current draw rect
  564.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  565.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  566.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  567.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  568.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  569.         
  570.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  571.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  572.         
  573.         if (qd_transWin || qd_intersection)
  574.         {
  575.             if (qd_transWin)    // current port is a transparent window
  576.             {
  577.                 //DebugStr ("\pStdRRect in transparent");
  578.                 //CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight);
  579.                 
  580.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  581.                 
  582.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  583.                 SetClip (qd_origPort->clipRgn);
  584.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  585.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  586.                 LockPixels (qd_contPMap);
  587.                 LMSetHiliteMode (qd_Hilite);
  588.  
  589.                 CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight); // do the draw!
  590.  
  591.                 UnlockPixels (qd_contPMap);
  592.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  593.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  594.                 
  595.                 SetGWorld (qd_origGWorld, qd_origGDH);
  596.             }
  597.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  598.             else if (qd_intersection)
  599.             {
  600.                 //DebugStr ("\pStdRRect intersection");
  601.                 //CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight);
  602.                 
  603.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  604.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  605.                 qd_curIntersection = qd_intersection;
  606.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  607.                 {
  608.                     SetPort ((*qd_curIntersection)->theWindow);
  609.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  610.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  611.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  612.                     if (!EmptyRgn (qd_curDrawRgn))
  613.                     {
  614.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  615.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  616.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  617.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  618.                         
  619.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  620.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  621.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  622.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  623.                         LockPixels (qd_underPMap);
  624.                         LMSetHiliteMode (qd_Hilite);
  625.  
  626.                         CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, &qd_drawingRect, ovalWidth, ovalHeight); // do the draw!
  627.  
  628.                         UnlockPixels (qd_underPMap);
  629.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  630.                         
  631.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  632.                         SetPort ((*qd_curIntersection)->theWindow);
  633.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  634.                     }
  635.                     
  636.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  637.                 }
  638.                 
  639.                 SetPort (qd_origPort);
  640.                 GetClip (qd_curClipRgn);
  641.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  642.                 SetClip (qd_drawingRgn);
  643.                 LMSetHiliteMode (qd_Hilite);
  644.                 CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight);
  645.                 SetClip (qd_curClipRgn);
  646.             }
  647.             
  648.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  649.         }
  650.         else // no need to redirect this draw
  651.             CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight);
  652.         
  653.         DisposeThemeDrawingState (qd_curDrawState);
  654.         X_RayDrawLevel--;
  655.     }
  656.     else
  657.         CallUniversalProc (gOldStdRRect, kStdRRectProcInfo, verb, theRect, ovalWidth, ovalHeight);
  658. }
  659.  
  660.  
  661. pascal void X_Ray_StdArc (GrafVerb verb, const Rect *theRect, short startAngle, short arcAngle)
  662. {
  663.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  664.     {
  665.         X_RayDrawLevel++;
  666.         
  667.         GetPort (&qd_origPort);
  668.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  669.         qd_Hilite = LMGetHiliteMode();
  670.         GetThemeDrawingState (&qd_curDrawState);
  671.         
  672.         qd_drawingRect = *theRect;                                        // save current draw rect
  673.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  674.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  675.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  676.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  677.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  678.         
  679.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  680.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  681.         
  682.         if (qd_transWin || qd_intersection)
  683.         {
  684.             if (qd_transWin)    // current port is a transparent window
  685.             {
  686.                 //DebugStr ("\pStdArc in transparent");
  687.                 //CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle);
  688.                 
  689.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  690.                 
  691.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  692.                 SetClip (qd_origPort->clipRgn);
  693.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  694.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  695.                 LockPixels (qd_contPMap);
  696.                 LMSetHiliteMode (qd_Hilite);
  697.  
  698.                 CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle); // do the draw!
  699.  
  700.                 UnlockPixels (qd_contPMap);
  701.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  702.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  703.                 
  704.                 SetGWorld (qd_origGWorld, qd_origGDH);
  705.             }
  706.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  707.             else if (qd_intersection)
  708.             {
  709.                 //DebugStr ("\pStdArc intersection");
  710.                 //CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle);
  711.                 
  712.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  713.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  714.                 qd_curIntersection = qd_intersection;
  715.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  716.                 {
  717.                     SetPort ((*qd_curIntersection)->theWindow);
  718.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  719.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  720.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  721.                     if (!EmptyRgn (qd_curDrawRgn))
  722.                     {
  723.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  724.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  725.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  726.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  727.                         
  728.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  729.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  730.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  731.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  732.                         LockPixels (qd_underPMap);
  733.                         LMSetHiliteMode (qd_Hilite);
  734.  
  735.                         CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, &qd_drawingRect, startAngle, arcAngle); // do the draw!
  736.  
  737.                         UnlockPixels (qd_underPMap);
  738.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  739.                         
  740.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  741.                         SetPort ((*qd_curIntersection)->theWindow);
  742.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  743.                     }
  744.                                         
  745.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  746.                 }
  747.                 
  748.                 SetPort (qd_origPort);
  749.                 GetClip (qd_curClipRgn);
  750.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  751.                 SetClip (qd_drawingRgn);
  752.                 LMSetHiliteMode (qd_Hilite);
  753.                 CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle);
  754.                 SetClip (qd_curClipRgn);
  755.             }
  756.             
  757.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  758.         }
  759.         else // no need to redirect this draw
  760.             CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle);
  761.         
  762.         DisposeThemeDrawingState (qd_curDrawState);
  763.         X_RayDrawLevel--;
  764.     }
  765.     else
  766.         CallUniversalProc (gOldStdArc, kStdArcProcInfo, verb, theRect, startAngle, arcAngle);
  767. }
  768.  
  769.  
  770. pascal void X_Ray_StdPoly (GrafVerb verb, PolyHandle poly)
  771. {
  772.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  773.     {
  774.         X_RayDrawLevel++;
  775.         
  776.         GetPort (&qd_origPort);
  777.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  778.         qd_Hilite = LMGetHiliteMode();
  779.         GetThemeDrawingState (&qd_curDrawState);
  780.         
  781.         qd_drawingRect = (*poly)->polyBBox;                                        // save current draw rect
  782.         RectRgn (qd_drawingRgn, &qd_drawingRect);                                // determine a region that bounds draw
  783.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  784.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  785.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  786.         X_Ray_LocalToGlobalPoly (poly);                                // globalize the polygon
  787.         
  788.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  789.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  790.         
  791.         if (qd_transWin || qd_intersection)
  792.         {
  793.             if (qd_transWin)    // current port is a transparent window
  794.             {
  795.                 //DebugStr ("\pStdPoly in transparent");
  796.                 //CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly);
  797.                 
  798.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  799.                 X_Ray_GlobalToLocalPoly (poly); // set to local coords of qd_origPort
  800.                 
  801.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  802.                 SetClip (qd_origPort->clipRgn);
  803.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  804.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  805.                 LockPixels (qd_contPMap);
  806.                 LMSetHiliteMode (qd_Hilite);
  807.  
  808.                 CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly); // do the draw!
  809.  
  810.                 UnlockPixels (qd_contPMap);
  811.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  812.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  813.                 
  814.                 SetGWorld (qd_origGWorld, qd_origGDH);
  815.             }
  816.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  817.             else if (qd_intersection)
  818.             {
  819.                 //DebugStr ("\pStdPoly intersection");
  820.                 //CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly);
  821.                 
  822.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  823.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  824.                 qd_curIntersection = qd_intersection;
  825.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  826.                 {
  827.                     SetPort ((*qd_curIntersection)->theWindow);
  828.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  829.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  830.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  831.                     if (!EmptyRgn (qd_curDrawRgn))
  832.                     {
  833.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  834.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  835.                         X_Ray_GlobalToLocalPoly (poly);
  836.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  837.                         
  838.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  839.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  840.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  841.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  842.                         LockPixels (qd_underPMap);
  843.                         LMSetHiliteMode (qd_Hilite);
  844.  
  845.                         CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly); // do the draw!
  846.  
  847.                         UnlockPixels (qd_underPMap);
  848.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  849.                         
  850.                         SetGWorld (qd_origGWorld, qd_origGDH);
  851.                         SetPort ((*qd_curIntersection)->theWindow);
  852.                         X_Ray_LocalToGlobalPoly (poly);
  853.                     }
  854.                                     
  855.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  856.                 }
  857.                 
  858.                 SetPort (qd_origPort);
  859.                 GetClip (qd_curClipRgn);
  860.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  861.                 X_Ray_GlobalToLocalPoly (poly);
  862.                 SetClip (qd_drawingRgn);
  863.                 LMSetHiliteMode (qd_Hilite);
  864.                 CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly);
  865.                 SetClip (qd_curClipRgn);
  866.             }
  867.             
  868.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  869.         }
  870.         else // no need to redirect this draw
  871.         {
  872.             X_Ray_GlobalToLocalPoly (poly);
  873.             CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly);
  874.         }
  875.         
  876.         DisposeThemeDrawingState (qd_curDrawState);
  877.         X_RayDrawLevel--;
  878.     }
  879.     else
  880.         CallUniversalProc (gOldStdPoly, kStdPolyProcInfo, verb, poly);
  881. }
  882.  
  883.  
  884. pascal void X_Ray_StdRgn (GrafVerb verb, RgnHandle rgn)
  885. {
  886.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  887.     {
  888.         X_RayDrawLevel++;
  889.         
  890.         GetPort (&qd_origPort);
  891.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  892.         qd_Hilite = LMGetHiliteMode();
  893.         GetThemeDrawingState (&qd_curDrawState);
  894.         
  895.         CopyRgn (rgn, qd_drawingRgn);                                // determine a region that bounds draw
  896.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  897.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  898.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  899.         
  900.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  901.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  902.         
  903.         if (qd_transWin || qd_intersection)
  904.         {
  905.             if (qd_transWin)    // current port is a transparent window
  906.             {
  907.                 //DebugStr ("\pStdRgn in transparent");
  908.                 //CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, rgn);
  909.                 
  910.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  911.                 
  912.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  913.                 SetClip (qd_origPort->clipRgn);
  914.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  915.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  916.                 LockPixels (qd_contPMap);
  917.                 LMSetHiliteMode (qd_Hilite);
  918.  
  919.                 CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, rgn);
  920.  
  921.                 UnlockPixels (qd_contPMap);
  922.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  923.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  924.                 
  925.                 SetGWorld (qd_origGWorld, qd_origGDH);
  926.             }
  927.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  928.             else if (qd_intersection)
  929.             {
  930.                 //DebugStr ("\pStdRgn intersection");
  931.                 //CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, rgn);
  932.                 
  933.                 //if (!(qd_Hilite & 0x80))
  934.                 //    DebugStr ("\philite intersection region");
  935.                 
  936.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  937.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  938.                 qd_curIntersection = qd_intersection;
  939.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  940.                 {
  941.                     SetPort ((*qd_curIntersection)->theWindow);
  942.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  943.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  944.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  945.                     if (!EmptyRgn (qd_curDrawRgn))
  946.                     {
  947.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  948.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  949.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  950.                         
  951.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  952.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  953.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  954.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  955.                         LockPixels (qd_underPMap);
  956.                         LMSetHiliteMode (qd_Hilite);
  957.                         
  958.                         CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, qd_curDrawRgn);
  959.  
  960.                         UnlockPixels (qd_underPMap);
  961.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  962.                         
  963.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  964.                         SetPort ((*qd_curIntersection)->theWindow);
  965.                     }                    
  966.                     
  967.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  968.                 }
  969.                 
  970.                 SetPort (qd_origPort);
  971.                 GetClip (qd_curClipRgn);
  972.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  973.                 SetClip (qd_drawingRgn);
  974.                 LMSetHiliteMode (qd_Hilite);
  975.                 CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, rgn);
  976.                 SetClip (qd_curClipRgn);
  977.             }
  978.             
  979.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  980.         }
  981.         else // no need to redirect this draw
  982.             CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, rgn);
  983.         
  984.         DisposeThemeDrawingState (qd_curDrawState);
  985.         X_RayDrawLevel--;
  986.     }
  987.     else
  988.         CallUniversalProc (gOldStdRgn, kStdRgnProcInfo, verb, rgn);
  989. }
  990.  
  991.  
  992. pascal void X_Ray_StdBits (const BitMap *srcBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn)
  993. {
  994.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  995.     {
  996.         X_RayDrawLevel++;
  997.         
  998.         GetPort (&qd_origPort);
  999.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  1000.         GetThemeDrawingState (&qd_curDrawState);
  1001.         
  1002.         qd_drawingRect = *dstRect;                                        // save current draw rect
  1003.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  1004.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  1005.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  1006.         if (maskRgn)
  1007.             SectRgn (maskRgn, qd_drawingRgn, qd_drawingRgn);                // clip to the specified maskRgn
  1008.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  1009.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  1010.         
  1011.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  1012.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  1013.         
  1014.         if (qd_transWin || qd_intersection)
  1015.         {
  1016.             if (qd_transWin)    // current port is a transparent window
  1017.             {
  1018.                 //DebugStr ("\pStdBits in transparent");
  1019.                 //CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, maskRgn);
  1020.                 
  1021.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  1022.                 
  1023.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  1024.                 SetClip (qd_drawingRgn);
  1025.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1026.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  1027.                 LockPixels (qd_contPMap);
  1028.                 CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, qd_drawingRgn); // do the draw!
  1029.                 UnlockPixels (qd_contPMap);
  1030.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  1031.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1032.                 
  1033.                 SetGWorld (qd_origGWorld, qd_origGDH);
  1034.             }
  1035.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  1036.             else if (qd_intersection)
  1037.             {
  1038.                 //DebugStr ("\pStdBits intersection");
  1039.                 //CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, maskRgn);
  1040.                 
  1041.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  1042.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  1043.                 qd_curIntersection = qd_intersection;
  1044.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  1045.                 {
  1046.                     SetPort ((*qd_curIntersection)->theWindow);
  1047.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1048.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1049.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  1050.                     if (!EmptyRgn (qd_curDrawRgn))
  1051.                     {
  1052.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  1053.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  1054.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  1055.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1056.                         
  1057.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  1058.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1059.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  1060.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  1061.                         LockPixels (qd_underPMap);
  1062.                         CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, &qd_drawingRect, mode, qd_curDrawRgn); // do the draw!
  1063.                         UnlockPixels (qd_underPMap);
  1064.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  1065.                         
  1066.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  1067.                         SetPort ((*qd_curIntersection)->theWindow);
  1068.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  1069.                     }                    
  1070.                     
  1071.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1072.                 }
  1073.                 
  1074.                 SetPort (qd_origPort);
  1075.                 GetClip (qd_curClipRgn);
  1076.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  1077.                 SetClip (qd_drawingRgn);
  1078.                 CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, maskRgn);
  1079.                 SetClip (qd_curClipRgn);
  1080.             }
  1081.             
  1082.             UpdateTransparentWindows_Special();    // updates transparent window list from back to front looking for transparentUpdateRgns
  1083.         }
  1084.         else // no need to redirect this draw
  1085.             CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, maskRgn);
  1086.         
  1087.         DisposeThemeDrawingState (qd_curDrawState);
  1088.         X_RayDrawLevel--;
  1089.     }
  1090.     else
  1091.         CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, maskRgn);
  1092. }
  1093.  
  1094.  
  1095. // CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, dstBits, srcRect, dstRect, mode, maskRgn);
  1096. pascal void X_Ray_CopyBits (const BitMap *srcBits, const BitMap *dstBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn)
  1097. {
  1098.     unsigned long    dummy;
  1099.     
  1100.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  1101.     {
  1102.         X_RayDrawLevel++;
  1103.         
  1104.         GetPort (&qd_origPort);
  1105.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  1106.         GetThemeDrawingState (&qd_curDrawState);
  1107.         
  1108.         qd_drawingRect = *dstRect;                                        // save current draw rect
  1109.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  1110.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  1111.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  1112.         if (maskRgn)
  1113.             SectRgn (maskRgn, qd_drawingRgn, qd_drawingRgn);                // clip to the specified maskRgn
  1114.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  1115.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  1116.         
  1117.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  1118.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  1119.         
  1120.         if (qd_transWin || qd_intersection)
  1121.         {
  1122.             if (qd_transWin)    // current port is a transparent window
  1123.             {
  1124.                 //DebugStr ("\pCopyBits in transparent");
  1125.                 //CallUniversalProc (gOldStdBits, kStdBitsProcInfo, srcBits, srcRect, dstRect, mode, maskRgn);
  1126.                 
  1127.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  1128.                 
  1129.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  1130.                 SetClip (qd_drawingRgn);
  1131.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1132.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  1133.                 LockPixels (qd_contPMap);
  1134.                 CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, (BitMap*)*qd_contPMap, srcRect, dstRect, mode, qd_drawingRgn); // do the draw!
  1135.                 UnlockPixels (qd_contPMap);
  1136.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  1137.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1138.                 
  1139.                 SetGWorld (qd_origGWorld, qd_origGDH);
  1140.             }
  1141.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  1142.             else if (qd_intersection)
  1143.             {
  1144.                 if (srcBits == dstBits) // copies to self need extra help to prevent copying the contents of the trans wins
  1145.                     SetEmptyRgn (qd_copyBitsToSelfClipRgn);
  1146.                 
  1147.                 //DebugStr ("\pCopyBits intersection");
  1148.                 //CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, dstBits, srcRect, dstRect, mode, maskRgn);
  1149.                 
  1150.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  1151.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  1152.                 qd_curIntersection = qd_intersection;
  1153.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  1154.                 {
  1155.                     SetPort ((*qd_curIntersection)->theWindow);
  1156.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1157.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1158.                     if (srcBits == dstBits) // help with copy to self
  1159.                         UnionRgn (qd_curDrawRgn, qd_copyBitsToSelfClipRgn, qd_copyBitsToSelfClipRgn);
  1160.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  1161.                     if (!EmptyRgn (qd_curDrawRgn))
  1162.                     {
  1163.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  1164.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  1165.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  1166.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1167.                         
  1168.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  1169.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1170.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  1171.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  1172.                         LockPixels (qd_underPMap);
  1173.                         CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, (BitMap*)*qd_underPMap, srcRect, &qd_drawingRect, mode, qd_curDrawRgn); // do the draw!
  1174.                         UnlockPixels (qd_underPMap);
  1175.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  1176.                         
  1177.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  1178.                         SetPort ((*qd_curIntersection)->theWindow);
  1179.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  1180.                     }                    
  1181.                     
  1182.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1183.                 }
  1184.                 
  1185.                 SetPort (qd_origPort);
  1186.                 GetClip (qd_curClipRgn);
  1187.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  1188.                 if (srcBits == dstBits) // help with copy to self
  1189.                 {
  1190.                     // this assures that the copy doesn't copy what is in any intersecting trans wins
  1191.                     // the Mac OS 8 Finder does this when scrolling a window instead of calling ScrollRect()                    
  1192.                     X_Ray_GlobalToLocalRgn (qd_copyBitsToSelfClipRgn);
  1193.                     DiffRgn (qd_curDrawRgn, qd_copyBitsToSelfClipRgn, qd_curDrawRgn);
  1194.                     InvalRgn (qd_copyBitsToSelfClipRgn); // force an update after the CopyBits
  1195.                     OffsetRgn (qd_copyBitsToSelfClipRgn, dstRect->left - srcRect->left, dstRect->top - srcRect->top);
  1196.                     DiffRgn (qd_curDrawRgn, qd_copyBitsToSelfClipRgn, qd_curDrawRgn);
  1197.                     InvalRgn (qd_copyBitsToSelfClipRgn); // force an update after the CopyBits
  1198.                 }
  1199.                 SetClip (qd_drawingRgn);
  1200.                 CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, dstBits, srcRect, dstRect, mode, maskRgn);
  1201.                 SetClip (qd_curClipRgn);
  1202.             }
  1203.             
  1204.             UpdateTransparentWindows_Special();    // updates transparent window list from back to front looking for transparentUpdateRgns
  1205.         }
  1206.         else // no need to redirect this draw
  1207.             CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, dstBits, srcRect, dstRect, mode, maskRgn);
  1208.         
  1209.         DisposeThemeDrawingState (qd_curDrawState);
  1210.         X_RayDrawLevel--;
  1211.     }
  1212.     else
  1213.         CallUniversalProc (gOldCopyBits, kCopyBitsProcInfo, srcBits, dstBits, srcRect, dstRect, mode, maskRgn);
  1214. }
  1215.  
  1216.  
  1217. pascal void X_Ray_CopyDeepMask (const BitMap *srcBits, const BitMap *maskBits, const BitMap *dstBits, const Rect *srcRect, const Rect *maskRect, const Rect *dstRect, short mode, RgnHandle maskRgn)
  1218. {
  1219.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  1220.     {
  1221.         X_RayDrawLevel++;
  1222.         
  1223.         GetPort (&qd_origPort);
  1224.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  1225.         GetThemeDrawingState (&qd_curDrawState);
  1226.         
  1227.         qd_drawingRect = *dstRect;                                        // save current draw rect
  1228.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  1229.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  1230.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  1231.         if (maskRgn)
  1232.             SectRgn (maskRgn, qd_drawingRgn, qd_drawingRgn);                // clip to the specified maskRgn
  1233.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  1234.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  1235.         
  1236.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  1237.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  1238.         
  1239.         if (qd_transWin || qd_intersection)
  1240.         {
  1241.             if (qd_transWin)    // current port is a transparent window
  1242.             {
  1243.                 //DebugStr ("\pCopyDeepMask in transparent");
  1244.                 //CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect, mode, maskRgn);
  1245.                 
  1246.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  1247.                 
  1248.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  1249.                 SetClip (qd_drawingRgn);
  1250.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1251.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  1252.                 LockPixels (qd_contPMap);
  1253.                 CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, (BitMap*)*qd_contPMap, srcRect, maskRect, dstRect, mode, qd_drawingRgn); // do the draw!
  1254.                 UnlockPixels (qd_contPMap);
  1255.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  1256.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1257.                 
  1258.                 SetGWorld (qd_origGWorld, qd_origGDH);
  1259.             }
  1260.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  1261.             else if (qd_intersection)
  1262.             {
  1263.                 //DebugStr ("\pCopyDeepMask intersection");
  1264.                 //CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect, mode, maskRgn);
  1265.                 
  1266.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  1267.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  1268.                 qd_curIntersection = qd_intersection;
  1269.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  1270.                 {
  1271.                     SetPort ((*qd_curIntersection)->theWindow);
  1272.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1273.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1274.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  1275.                     if (!EmptyRgn (qd_curDrawRgn))
  1276.                     {
  1277.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  1278.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  1279.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  1280.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1281.                         
  1282.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  1283.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1284.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  1285.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  1286.                         LockPixels (qd_underPMap);
  1287.                         CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, (BitMap*)*qd_underPMap, srcRect, maskRect, &qd_drawingRect, mode, qd_curDrawRgn); // do the draw!
  1288.                         UnlockPixels (qd_underPMap);
  1289.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  1290.                         
  1291.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  1292.                         SetPort ((*qd_curIntersection)->theWindow);
  1293.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  1294.                     }                    
  1295.                     
  1296.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1297.                 }
  1298.                 
  1299.                 SetPort (qd_origPort);
  1300.                 GetClip (qd_curClipRgn);
  1301.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  1302.                 SetClip (qd_drawingRgn);
  1303.                 CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect, mode, maskRgn);
  1304.                 SetClip (qd_curClipRgn);
  1305.             }
  1306.             
  1307.             UpdateTransparentWindows_Special();    // updates transparent window list from back to front looking for transparentUpdateRgns
  1308.         }
  1309.         else // no need to redirect this draw
  1310.             CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect, mode, maskRgn);
  1311.         
  1312.         DisposeThemeDrawingState (qd_curDrawState);
  1313.         X_RayDrawLevel--;
  1314.     }
  1315.     else
  1316.         CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect, mode, maskRgn);
  1317. }
  1318.  
  1319.  
  1320. pascal void X_Ray_CopyMask (const BitMap *srcBits, const BitMap *maskBits, const BitMap *dstBits, const Rect *srcRect, const Rect *maskRect, const Rect *dstRect)
  1321. {
  1322.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  1323.     {
  1324.         X_RayDrawLevel++;
  1325.         
  1326.         GetPort (&qd_origPort);
  1327.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  1328.         GetThemeDrawingState (&qd_curDrawState);
  1329.         
  1330.         qd_drawingRect = *dstRect;                                        // save current draw rect
  1331.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  1332.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  1333.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  1334.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  1335.         X_Ray_LocalToGlobalRect (&qd_drawingRect);                        // globalize draw rect
  1336.         
  1337.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  1338.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  1339.         
  1340.         if (qd_transWin || qd_intersection)
  1341.         {
  1342.             if (qd_transWin)    // current port is a transparent window
  1343.             {
  1344.                 //DebugStr ("\pCopyMask in transparent");
  1345.                 //CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect);
  1346.                 
  1347.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  1348.                 
  1349.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  1350.                 SetClip (qd_drawingRgn);
  1351.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1352.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  1353.                 LockPixels (qd_contPMap);
  1354.                 CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, (BitMap*)*qd_contPMap, srcRect, maskRect, dstRect);
  1355.                 UnlockPixels (qd_contPMap);
  1356.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  1357.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1358.                 
  1359.                 SetGWorld (qd_origGWorld, qd_origGDH);
  1360.             }
  1361.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  1362.             else if (qd_intersection)
  1363.             {
  1364.                 //DebugStr ("\pCopyMask intersection");
  1365.                 //CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect);
  1366.                 
  1367.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  1368.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  1369.                 qd_curIntersection = qd_intersection;
  1370.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  1371.                 {
  1372.                     SetPort ((*qd_curIntersection)->theWindow);
  1373.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1374.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1375.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  1376.                     if (!EmptyRgn (qd_curDrawRgn))
  1377.                     {
  1378.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  1379.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  1380.                         X_Ray_GlobalToLocalRect (&qd_drawingRect);
  1381.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1382.                         
  1383.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  1384.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1385.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  1386.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  1387.                         LockPixels (qd_underPMap);
  1388.                         CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, (BitMap*)*qd_underPMap, srcRect, maskRect, &qd_drawingRect);
  1389.                         UnlockPixels (qd_underPMap);
  1390.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  1391.                         
  1392.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  1393.                         SetPort ((*qd_curIntersection)->theWindow);
  1394.                         X_Ray_LocalToGlobalRect (&qd_drawingRect);    // and set up for the next possible draw
  1395.                     }                    
  1396.                     
  1397.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1398.                 }
  1399.                 
  1400.                 SetPort (qd_origPort);
  1401.                 GetClip (qd_curClipRgn);
  1402.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  1403.                 SetClip (qd_drawingRgn);
  1404.                 CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect);
  1405.                 SetClip (qd_curClipRgn);
  1406.             }
  1407.             
  1408.             UpdateTransparentWindows_Special();    // updates transparent window list from back to front looking for transparentUpdateRgns
  1409.         }
  1410.         else // no need to redirect this draw
  1411.             CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect);
  1412.         
  1413.         DisposeThemeDrawingState (qd_curDrawState);
  1414.         X_RayDrawLevel--;
  1415.     }
  1416.     else
  1417.         CallUniversalProc (gOldCopyMask, kCopyMaskProcInfo, srcBits, maskBits, dstBits, srcRect, maskRect, dstRect);
  1418. }
  1419.  
  1420.  
  1421. pascal void X_Ray_ScrollRect (const Rect *theRect, short dh, short dv, RgnHandle updateRgn)
  1422. {
  1423.     RgnHandle    curVisRgn, addedSectRgns;
  1424.     
  1425.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  1426.     {
  1427.         X_RayDrawLevel++;
  1428.         
  1429.         GetPort (&qd_origPort);
  1430.         
  1431.         RectRgn (qd_drawingRgn, theRect);
  1432.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);
  1433.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);
  1434.         if (qd_intersection)
  1435.         {
  1436.             // the rect to be scrolled does intersect at least one transWin
  1437.             curVisRgn = NewRgn();
  1438.             addedSectRgns = NewRgn();
  1439.             
  1440.             CopyRgn (qd_origPort->visRgn, curVisRgn); // save current port's visRgn
  1441.             
  1442.             qd_curIntersection = qd_intersection;
  1443.             while (qd_curIntersection) // walk forward through all trans wins to determine who all intersects the scroll rect
  1444.             {
  1445.                 SetPort ((*qd_curIntersection)->theWindow); // to get proper screen coordinates
  1446.                 CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1447.                 X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1448.                 SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  1449.                 UnionRgn (addedSectRgns, qd_curDrawRgn, addedSectRgns); // add together all intersecting trans window visRgns
  1450.                 
  1451.                 qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1452.             }
  1453.             
  1454.             SetPort (qd_origPort);
  1455.             X_Ray_GlobalToLocalRgn (addedSectRgns);
  1456.             DiffRgn (qd_origPort->visRgn, addedSectRgns, qd_origPort->visRgn);    // now subtract the intersecting transVisRgns from the cur ports visRgn
  1457.                                                                                 // this tricks QD into thinking it shouldn't scroll info in under the window
  1458.                                                                                 // and QD thinks it can't copy data from under the window as well
  1459.         }
  1460.         
  1461.         CallUniversalProc (gOldScrollRect, kScrollRectProcInfo, theRect, dh, dv, updateRgn);
  1462.         
  1463.         if (qd_intersection)
  1464.         {
  1465.             if (updateRgn)
  1466.                 UnionRgn (addedSectRgns, updateRgn, updateRgn); // add to the calculated updateRgn
  1467.             
  1468.             InvalRgn (addedSectRgns); // and force an update event for good masure
  1469.             
  1470.             CopyRgn (curVisRgn, qd_origPort->visRgn); // restore current port's visRgn
  1471.             
  1472.             DisposeRgn (addedSectRgns);
  1473.             DisposeRgn (curVisRgn);
  1474.         }
  1475.         
  1476.         X_RayDrawLevel--;
  1477.     }
  1478.     else
  1479.         CallUniversalProc (gOldScrollRect, kScrollRectProcInfo, theRect, dh, dv, updateRgn);
  1480. }
  1481.  
  1482.  
  1483. pascal void X_Ray_StdText (short count, const void *textAddr, Point *numer, Point *denom)
  1484. {
  1485.     if ((X_RayDrawLevel == 0) && gProcessManagerIsRunning)
  1486.     {
  1487.         X_RayDrawLevel++;
  1488.         
  1489.         GetPort (&qd_origPort);
  1490.         GetGWorld (&qd_origGWorld, &qd_origGDH);
  1491.         
  1492.         GetThemeDrawingState (&qd_curDrawState);
  1493.         
  1494.         qd_startPoint = qd_origPort->pnLoc;
  1495.         qd_endPoint = qd_startPoint;
  1496.         GetFontInfo (&qd_fInfo);
  1497.         // ADD
  1498.         // Should StdTxMeas be used instead of TextWidth?  TextWidth seems to work ok.
  1499.         qd_endPoint.h += TextWidth (textAddr, 0, count);
  1500.         qd_endPoint.v -= qd_fInfo.ascent;
  1501.         Pt2Rect (qd_endPoint, qd_startPoint, &qd_drawingRect);
  1502.         qd_drawingRect.bottom += qd_fInfo.descent + qd_fInfo.leading;    // make sure g's and j's don't get clipped
  1503.         InsetRect (&qd_drawingRect, -2, -2);
  1504.         RectRgn (qd_drawingRgn, &qd_drawingRect);                        // determine a region that bounds draw
  1505.         SectRgn (qd_origPort->clipRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current clipRgn
  1506.         SectRgn (qd_origPort->visRgn, qd_drawingRgn, qd_drawingRgn);    // clip draw region to the current visRgn
  1507.         X_Ray_LocalToGlobalRgn (qd_drawingRgn);                        // globalize draw region
  1508.         LocalToGlobal (&qd_startPoint);
  1509.         
  1510.         qd_transWin = X_Ray_GetWindowRec (qd_origPort);    // set up for analyzing how to draw
  1511.         qd_intersection = PortDoesIntersect (qd_origPort, qd_drawingRgn);    // see if qd_origPort is on screen and intersects at least one transparent port and qd_drawingRgn
  1512.         
  1513.         if (qd_transWin || qd_intersection)
  1514.         {
  1515.             if (qd_transWin)    // current port is a transparent window
  1516.             {
  1517.                 //DebugStr ("\pStdText in transparent");
  1518.                 //CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1519.                 
  1520.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn); // set to local coords of qd_origPort
  1521.                 
  1522.                 SetGWorld ((*qd_transWin)->contentBuffer, nil);
  1523.                 SetClip (qd_origPort->clipRgn);
  1524.                 SetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // set up contentBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1525.                 qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  1526.                 LockPixels (qd_contPMap);
  1527.                 
  1528.                 CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1529.                 
  1530.                 UnlockPixels (qd_contPMap);
  1531.                 UnsetupUnderBufferGWorld ((*qd_transWin)->contentBuffer, qd_origPort); // clear certain fields especially ones that are hazardous when persistent
  1532.                 UnionRgn (qd_drawingRgn, (*qd_transWin)->transparentUpdateRgn, (*qd_transWin)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1533.                 
  1534.                 SetGWorld (qd_origGWorld, qd_origGDH);
  1535.             }
  1536.             // draw wasn't to a transparent window, but the draw does intersect a transparent window
  1537.             else if (qd_intersection)
  1538.             {
  1539.                 //DebugStr ("\pStdText intersection");
  1540.                 //CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1541.                 
  1542.                 // walk transparent chain forward from qd_intersection and draw in underbuffers where draw intersects visRgns of owner ports
  1543.                 // this is a one level deep intersection, any more than this are handled when transparentUpdateRgns are updated
  1544.                 qd_curIntersection = qd_intersection;
  1545.                 while (qd_curIntersection && !EmptyRgn(qd_drawingRgn)) // draw in all transparent under buffers where intersection occurs at one level
  1546.                 {
  1547.                     SetPort ((*qd_curIntersection)->theWindow);
  1548.                     CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1549.                     X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1550.                     SectRgn (qd_drawingRgn, qd_curDrawRgn, qd_curDrawRgn);
  1551.                     if (!EmptyRgn (qd_curDrawRgn))
  1552.                     {
  1553.                         DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this portion of draw from the overall draw
  1554.                         X_Ray_GlobalToLocalRgn (qd_curDrawRgn);
  1555.                         GlobalToLocal (&qd_startPoint);
  1556.                         UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post notice the underbuffer has changed and window needs update
  1557.                         
  1558.                         SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  1559.                         SetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // set up underBuffer graphics port here: copy foreColor, backColor, etc. of qd_origPort
  1560.                         MoveTo (qd_startPoint.h, qd_startPoint.v);
  1561.                         SetClip (qd_curDrawRgn); // clip draw to the current local draw limits
  1562.                         qd_underPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer);
  1563.                         LockPixels (qd_underPMap);
  1564.  
  1565.                         CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1566.                         
  1567.                         UnlockPixels (qd_underPMap);
  1568.                         UnsetupUnderBufferGWorld ((*qd_curIntersection)->underBuffer, qd_origPort); // clear certain fields that are hazardous when persistent
  1569.                         
  1570.                         SetGWorld (qd_origGWorld, qd_origGDH);  // restore drawing environment
  1571.                         SetPort ((*qd_curIntersection)->theWindow);
  1572.                         LocalToGlobal (&qd_startPoint);
  1573.                     }                    
  1574.                     
  1575.                     qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1576.                 }
  1577.                 
  1578.                 SetPort (qd_origPort);
  1579.                 GetClip (qd_curClipRgn);
  1580.                 X_Ray_GlobalToLocalRgn (qd_drawingRgn);    // limit drawing to whatever is left of drawing region
  1581.                 SetClip (qd_drawingRgn);
  1582.                 CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1583.                 SetClip (qd_curClipRgn);
  1584.             }
  1585.             
  1586.             UpdateTransparentWindows_Normal();    // updates transparent window list from back to front looking for transparentUpdateRgns
  1587.         }
  1588.         else // no need to redirect this draw
  1589.             CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1590.         
  1591.         DisposeThemeDrawingState (qd_curDrawState);
  1592.         X_RayDrawLevel--;
  1593.     }
  1594.     else
  1595.         CallUniversalProc (gOldStdText, kStdTextProcInfo, count, textAddr, numer, denom);
  1596. }
  1597.  
  1598.  
  1599. // DRAWING UTILITIES
  1600.  
  1601. // upon entry the current port is curUnderBuffer
  1602. // this synchronizes the original dest port with the current underbuffer as best as it can
  1603. void SetupUnderBufferGWorld (GWorldPtr curUnderBuffer, GrafPtr sourcePort)
  1604. {
  1605.     SetThemeDrawingState (qd_curDrawState, false);
  1606.     
  1607.     if (((CGrafPtr)sourcePort)->portVersion&0xC000)    // sourcePort is color
  1608.     {
  1609.         if (sourcePort->grafProcs)
  1610.         {
  1611.             qd_underBufferCQDProcs = curUnderBuffer->grafProcs;                // save any preexisting CQDProcs for the underbuffer
  1612.             curUnderBuffer->grafProcs = ((CGrafPtr)sourcePort)->grafProcs;    // copy the sourcePorts CQDProcs
  1613.         }
  1614.         
  1615.         ((GrafVars*)*(curUnderBuffer->grafVars))->rgbHiliteColor = ((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->rgbHiliteColor;
  1616.         ((GrafVars*)*(curUnderBuffer->grafVars))->rgbOpColor = ((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->rgbOpColor;
  1617.         ((GrafVars*)*(curUnderBuffer->grafVars))->pmFgIndex = ((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmFgIndex;
  1618.         ((GrafVars*)*(curUnderBuffer->grafVars))->pmBkIndex = ((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmBkIndex;
  1619.         ((GrafVars*)*(curUnderBuffer->grafVars))->pmFlags = ((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmFlags;
  1620.         
  1621.         SetHandleSize (((GrafVars*)*(curUnderBuffer->grafVars))->pmFgColor, GetHandleSize(((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmFgColor));
  1622.         BlockMoveData (*((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmFgColor, *((GrafVars*)*(curUnderBuffer->grafVars))->pmFgColor, GetHandleSize(((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmFgColor));
  1623.         SetHandleSize (((GrafVars*)*(curUnderBuffer->grafVars))->pmBkColor, GetHandleSize(((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmBkColor));
  1624.         BlockMoveData (*((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmBkColor, *((GrafVars*)*(curUnderBuffer->grafVars))->pmBkColor, GetHandleSize(((GrafVars*)*(((CGrafPtr)sourcePort)->grafVars))->pmBkColor));
  1625.         
  1626.         curUnderBuffer->chExtra = ((CGrafPtr)sourcePort)->chExtra;
  1627.         curUnderBuffer->pnLocHFrac = ((CGrafPtr)sourcePort)->pnLocHFrac;
  1628.         qd_foreColor = ((CGrafPtr)sourcePort)->rgbFgColor;
  1629.         qd_backColor = ((CGrafPtr)sourcePort)->rgbBkColor;
  1630.         RGBForeColor (&qd_foreColor);
  1631.         RGBBackColor (&qd_backColor);
  1632.         
  1633.         CopyPixPat (((CGrafPtr)sourcePort)->bkPixPat, curUnderBuffer->bkPixPat);
  1634.         CopyPixPat (((CGrafPtr)sourcePort)->fillPixPat, curUnderBuffer->fillPixPat);
  1635.         CopyPixPat (((CGrafPtr)sourcePort)->pnPixPat, curUnderBuffer->pnPixPat);
  1636.     }
  1637.     else // sourcePort is BW
  1638.     {
  1639.         // ** need to do BW to color conversion of patterns **
  1640.         // ** what would be the best way to do this?
  1641.         // really a shame all ports aren't color
  1642.         
  1643.         // need to do BW to color conversion of grafProcs since grafProcs differ from color to BW
  1644.         // this maye be extreme voodoo
  1645.         if (sourcePort->grafProcs)
  1646.         {
  1647.             qd_underBufferCQDProcs = curUnderBuffer->grafProcs;
  1648.             
  1649.             qd_curCQDProcs.textProc = sourcePort->grafProcs->textProc;
  1650.             qd_curCQDProcs.lineProc = sourcePort->grafProcs->lineProc;
  1651.             qd_curCQDProcs.rectProc = sourcePort->grafProcs->rectProc;
  1652.             qd_curCQDProcs.rRectProc = sourcePort->grafProcs->rRectProc;
  1653.             qd_curCQDProcs.ovalProc = sourcePort->grafProcs->ovalProc;
  1654.             qd_curCQDProcs.arcProc = sourcePort->grafProcs->arcProc;
  1655.             qd_curCQDProcs.polyProc = sourcePort->grafProcs->polyProc;
  1656.             qd_curCQDProcs.rgnProc = sourcePort->grafProcs->rgnProc;
  1657.             qd_curCQDProcs.bitsProc = sourcePort->grafProcs->bitsProc;
  1658.             qd_curCQDProcs.commentProc = sourcePort->grafProcs->commentProc;
  1659.             qd_curCQDProcs.txMeasProc = sourcePort->grafProcs->txMeasProc;
  1660.             qd_curCQDProcs.getPicProc = sourcePort->grafProcs->getPicProc;
  1661.             qd_curCQDProcs.putPicProc = sourcePort->grafProcs->putPicProc;
  1662.             // nil un-used portions of grafProcs
  1663.             qd_curCQDProcs.opcodeProc = nil;
  1664.             qd_curCQDProcs.newProc1 = nil;
  1665.             qd_curCQDProcs.glyphsProc = ((CQDProcs*)sourcePort->grafProcs)->glyphsProc;
  1666.             qd_curCQDProcs.printerStatusProc = ((CQDProcs*)sourcePort->grafProcs)->printerStatusProc;
  1667.             qd_curCQDProcs.newProc4 = nil;
  1668.             qd_curCQDProcs.newProc5 = nil;
  1669.             qd_curCQDProcs.newProc6 = nil;
  1670.             
  1671.             curUnderBuffer->grafProcs = &qd_curCQDProcs;
  1672.         }
  1673.         
  1674.         curUnderBuffer->fgColor = sourcePort->fgColor;
  1675.         curUnderBuffer->bkColor = sourcePort->bkColor;
  1676.     }
  1677.     
  1678.     // Pen Metrics
  1679.     //curUnderBuffer->pnLoc = sourcePort->pnLoc;    // this is wrong, needs to be made global from sourcePort and then local to curUnderBuffer
  1680.     //curUnderBuffer->pnSize = sourcePort->pnSize;    // don't know why this is commented out
  1681.     //curUnderBuffer->pnMode = sourcePort->pnMode;    // don't know why this is commented out
  1682.     //curUnderBuffer->pnVis = sourcePort->pnVis;    // don't know why this is commented out
  1683.     
  1684.     // Font Metrics
  1685.     curUnderBuffer->txFont = sourcePort->txFont;
  1686.     curUnderBuffer->txFace = sourcePort->txFace;
  1687.     curUnderBuffer->txMode = sourcePort->txMode;
  1688.     curUnderBuffer->txSize = sourcePort->txSize;
  1689.     curUnderBuffer->spExtra = sourcePort->spExtra;
  1690.     
  1691.     //curUnderBuffer->colrBit = sourcePort->colrBit;        // don't know why this is commented out
  1692.     
  1693.     //curUnderBuffer->patStretch = sourcePort->patStretch;    // don't know why this is commented out
  1694.     
  1695.     PortChanged ((GrafPtr)curUnderBuffer);
  1696. }
  1697.  
  1698.  
  1699. // upon entry the current port is curUnderBuffer
  1700. // ok this doesn't do much for now, but it is here in case it is needed for more than just qdprocs
  1701. void UnsetupUnderBufferGWorld (GWorldPtr curUnderBuffer, GrafPtr sourcePort)
  1702. {
  1703.     if (((CGrafPtr)sourcePort)->portVersion&0xC000)    // sourcePort is color
  1704.     {
  1705.     }
  1706.     else // curPort is BW
  1707.     {
  1708.     }
  1709.     
  1710.     PenMode (srcCopy);
  1711.     
  1712.     ForeColor (blackColor);
  1713.     BackColor (whiteColor);
  1714.     curUnderBuffer->grafProcs = qd_underBufferCQDProcs;
  1715.     
  1716.     PortChanged ((GrafPtr)curUnderBuffer);
  1717. }
  1718.  
  1719.  
  1720. // updates transparent windows that have non empty transparentUpdateRgn
  1721. // normal = true    -- will call CopyDeepMask
  1722. // normal = false    -- will call CopyDeepMask via patch
  1723. void UpdateTransparentWindows (Boolean normal)
  1724. {
  1725.     GetPort (&qd_origPort);
  1726.     GetGWorld (&qd_origGWorld, &qd_origGDH);
  1727.     
  1728.     if (qd_transWin == nil)
  1729.         qd_transWin = qd_intersection;
  1730.     while (qd_transWin)
  1731.     {
  1732.         if (!EmptyRgn ((*qd_transWin)->transparentUpdateRgn))
  1733.         {
  1734.             SetPort ((*qd_transWin)->theWindow); // set port to the on screen port (window) so the correct coordinate system will be in effect
  1735.             
  1736.             // these are both currently local to qd_transWin
  1737.             qd_drawingRect = (*(*qd_transWin)->transparentUpdateRgn)->rgnBBox;
  1738.             CopyRgn ((*qd_transWin)->transparentUpdateRgn,  qd_drawingRgn);
  1739.             SetEmptyRgn ((*qd_transWin)->transparentUpdateRgn); // remove this transparent update event
  1740.             
  1741.             GetClip (qd_curClipRgn); // because the real on-screen windows for transparent windows get updated from off screen, the real clipRgns can be "ignored" during updates
  1742.             SetClip (qd_drawingRgn);
  1743.             
  1744.             // Fill the mixBuffer
  1745.             // first copy in the underBuffer
  1746.             SetGWorld ((*qd_transWin)->mixBuffer, nil);
  1747.             ForeColor (blackColor);
  1748.             BackColor (whiteColor);
  1749.             qd_mixPMap = GetGWorldPixMap ((*qd_transWin)->mixBuffer);
  1750.             LockPixels (qd_mixPMap);
  1751.             qd_underPMap = GetGWorldPixMap ((*qd_transWin)->underBuffer);
  1752.             LockPixels (qd_underPMap);
  1753.             if (normal)
  1754.                 CopyBits ((BitMap*)*qd_underPMap, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_drawingRect, srcCopy, qd_drawingRgn);
  1755.             else
  1756.                 CallUniversalProc (gOldStdBits, kStdBitsProcInfo, (BitMap*)*qd_underPMap, &qd_drawingRect, &qd_drawingRect, srcCopy, qd_drawingRgn); // do the draw!
  1757.             UnlockPixels (qd_mixPMap);
  1758.             UnlockPixels (qd_underPMap);
  1759.             
  1760.             // next copy in the contentBuffer
  1761.             //SetupMaskBuffer (&qd_drawingRect, (*qd_transWin)->transparency); // match maskBuffer to current dimensions of draw, this is pretty slow
  1762.             RGBBackColor (&(*qd_transWin)->clearColor); // either it will be white, or the clear color
  1763.             qd_mixPMap = GetGWorldPixMap ((*qd_transWin)->mixBuffer);
  1764.             LockPixels (qd_mixPMap);
  1765.             qd_maskPMap = GetGWorldPixMap ((*qd_transWin)->maskBuffer);
  1766.             LockPixels (qd_maskPMap);
  1767.             qd_contPMap = GetGWorldPixMap ((*qd_transWin)->contentBuffer);
  1768.             LockPixels (qd_contPMap);
  1769.             
  1770.             // !!! this is actually what makes a window transparent (or clear), the call to CopyDeepMask when mixing the under buffer and content buffer in the mix buffer
  1771.             if (normal)
  1772.                 CopyDeepMask ((BitMap*)*qd_contPMap, (BitMap*)*qd_maskPMap, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_drawingRect, &qd_drawingRect, srcCopy, qd_drawingRgn);
  1773.                 //CopyDeepMask ((BitMap*)*qd_contPMap, (BitMap*)*qd_maskPMap, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_drawingRect, &qd_drawingRect, ((*qd_transWin)->windowKind&kIsClear) ? transparent : srcCopy, qd_drawingRgn);
  1774.             else
  1775.                 CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, (BitMap*)*qd_contPMap, (BitMap*)*qd_maskPMap, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_drawingRect, &qd_drawingRect, srcCopy, qd_drawingRgn);
  1776.                 //CallUniversalProc (gOldCopyDeepMask, kCopyDeepMaskProcInfo, (BitMap*)*qd_contPMap, (BitMap*)*qd_maskPMap, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_drawingRect, &qd_drawingRect, ((*qd_transWin)->windowKind&kIsClear) ? transparent : srcCopy, qd_drawingRgn);
  1777.             
  1778.             UnlockPixels (qd_mixPMap);
  1779.             UnlockPixels (qd_maskPMap);
  1780.             UnlockPixels (qd_contPMap);
  1781.             
  1782.             // get ready to update the screen
  1783.             SetGWorld (qd_origGWorld, qd_origGDH); // restore drawing environment, specifically curDevice
  1784.             SetPort ((*qd_transWin)->theWindow); // set port to the on-screen port so the correct coordinate system will be in effect
  1785.             X_Ray_LocalToGlobalRgn (qd_drawingRgn);
  1786.             qd_curDrawingRect = qd_drawingRect;
  1787.             X_Ray_LocalToGlobalRect (&qd_curDrawingRect);
  1788.             // first update any underbuffers of intersecting transparent windows
  1789.             // walk forward in the window chain from qd_transWin
  1790.             qd_curIntersection = GetNextWindowAbove (qd_transWin);
  1791.             while (qd_curIntersection)
  1792.             {
  1793.                 SetPort ((*qd_curIntersection)->theWindow); // set port to the on screen port so the correct coordinate system will be in effect for the underBuffer
  1794.                 
  1795.                 CopyRgn ((*qd_curIntersection)->theWindow->visRgn, qd_curDrawRgn);
  1796.                 X_Ray_LocalToGlobalRgn (qd_curDrawRgn);
  1797.                 SectRgn (qd_curDrawRgn, qd_drawingRgn, qd_curDrawRgn);
  1798.                 if (!EmptyRgn (qd_curDrawRgn)) // areas overlap?
  1799.                 {
  1800.                     DiffRgn (qd_drawingRgn, qd_curDrawRgn, qd_drawingRgn); // subtract this draw (in global coordinates) from the overall draw
  1801.                     
  1802.                     X_Ray_GlobalToLocalRgn (qd_curDrawRgn); // make everything local to the current underbuffer via the coord system of its real on-screen window
  1803.                     X_Ray_GlobalToLocalRect (&qd_curDrawingRect);
  1804.                     UnionRgn (qd_curDrawRgn, (*qd_curIntersection)->transparentUpdateRgn, (*qd_curIntersection)->transparentUpdateRgn); // post the update for this underBuffer
  1805.                     
  1806.                     SetGWorld ((*qd_curIntersection)->underBuffer, nil);
  1807.                     ForeColor (blackColor);
  1808.                     BackColor (whiteColor);
  1809.                                         
  1810.                     qd_curUnderPMap = GetGWorldPixMap ((*qd_curIntersection)->underBuffer); // get ready to do this draw portion
  1811.                     LockPixels (qd_curUnderPMap);
  1812.                     qd_mixPMap = GetGWorldPixMap ((*qd_transWin)->mixBuffer);
  1813.                     LockPixels (qd_mixPMap);
  1814.                     
  1815.                     ClipRect (&(*qd_curUnderPMap)->bounds); // make sure clip is wide open
  1816.                     
  1817.                     if (normal)
  1818.                         CopyBits ((BitMap*)*qd_mixPMap, (BitMap*)*qd_curUnderPMap, &qd_drawingRect, &qd_curDrawingRect, srcCopy, qd_curDrawRgn); // note the source rect is qd_drawingRect, which is appropriately local to qd_mixPMap
  1819.                     else
  1820.                         CallUniversalProc (gOldStdBits, kStdBitsProcInfo, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_curDrawingRect, srcCopy, qd_curDrawRgn); // note the source rect is qd_drawingRect, which is appropriately local to qd_mixPMap
  1821.                     
  1822.                     SetGWorld (qd_origGWorld, qd_origGDH); // restore drawing environment, specicfically curDevice
  1823.                     SetPort ((*qd_curIntersection)->theWindow); // set port to the on screen port so the correct coordinate system will be in effect for the underBuffer
  1824.                     
  1825.                     UnlockPixels (qd_curUnderPMap);
  1826.                     UnlockPixels (qd_mixPMap);
  1827.                     
  1828.                     X_Ray_LocalToGlobalRect (&qd_curDrawingRect);
  1829.                 }
  1830.                 
  1831.                 qd_curIntersection = GetNextWindowAbove (qd_curIntersection);
  1832.             }
  1833.             
  1834.             SetPort ((*qd_transWin)->theWindow); // alright, all one level underBuffer intersections have been updated, so finish this update
  1835.             GetForeColor (&qd_foreColor);
  1836.             GetBackColor (&qd_backColor);
  1837.             ForeColor (blackColor);
  1838.             BackColor (whiteColor);
  1839.                         
  1840.             X_Ray_GlobalToLocalRgn (qd_drawingRgn);
  1841.             
  1842.             // finish the draw
  1843.             qd_mixPMap = GetGWorldPixMap ((*qd_transWin)->mixBuffer);
  1844.             LockPixels (qd_mixPMap);
  1845.             if (normal)
  1846.                 CopyBits ((BitMap*)*qd_mixPMap, &(*qd_transWin)->theWindow->portBits, &qd_drawingRect, &qd_drawingRect, srcCopy, qd_drawingRgn);
  1847.             else
  1848.                 CallUniversalProc (gOldStdBits, kStdBitsProcInfo, (BitMap*)*qd_mixPMap, &qd_drawingRect, &qd_drawingRect, srcCopy, qd_drawingRgn);
  1849.             UnlockPixels (qd_mixPMap);
  1850.             // restore theWindow parameters
  1851.             RGBForeColor (&qd_foreColor);
  1852.             RGBBackColor (&qd_backColor);
  1853.             SetClip (qd_curClipRgn);
  1854.             
  1855.             SetPort (qd_origPort);
  1856.         }
  1857.         
  1858.         // walk up the window list one level
  1859.         qd_transWin = GetNextWindowAbove (qd_transWin);
  1860.     }
  1861. }
  1862.